package com.tarena.lbs.attach.service.impl;

import com.tarena.lbs.attach.dao.repository.AttachRepository;
import com.tarena.lbs.attach.enums.FileTypeEnum;
import com.tarena.lbs.attach.pojo.dto.AttachDTO;
import com.tarena.lbs.attach.pojo.po.AttachPO;
import com.tarena.lbs.attach.service.AttachService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

@Slf4j
@Service
public class AttachServiceImpl implements AttachService {
    @Autowired
    private AttachRepository attachRepository;

    @Override
    public AttachDTO insertAttachInfo(MultipartFile file, String fileUuid) {
        // 1. 参数校验
        if (file == null || file.isEmpty() || fileUuid == null || fileUuid.isEmpty()) {
            log.warn("文件或文件UUID为空");
            return null;
        }
        // 3. 构建AttachPO对象
        AttachPO attachPO = new AttachPO();
        attachPO.setFileUuid(fileUuid);
        attachPO.setClientFileName(file.getOriginalFilename());
        attachPO.setContentLength(file.getSize());
        attachPO.setContentType(mapContentType(file.getContentType())); // 需要实现类型映射方法
        attachPO.setDownloadTimes(0);
        attachPO.setStatus(1); // 状态后续扩展
        attachPO.setGmtCreate(System.currentTimeMillis());
        attachPO.setGmtModified(System.currentTimeMillis());
        attachPO.setBusinessId(0);
        attachPO.setBusinessType(0);
        // 4. 保存到数据库
        attachRepository.insert(attachPO);
        // 5. 转换为DTO并返回
        log.debug("插入附件信息业务,attachPO:{}", attachPO);
        return convertToDTO(attachPO);
    }

    /**
     * 将文件类型字符串转换为 Integer 类型的枚举值
     * @param contentType 文件类型字符串，例如 "image/jpeg"
     * @return 对应的 Integer 类型枚举值，例如 1（图片）或 2（视频），如果未知则返回 0
     */
    private Integer mapContentType(String contentType) {
        if (contentType == null || contentType.isEmpty()) {
            return FileTypeEnum.UNKNOWN.getType();
        }
        if (contentType.startsWith("image/")) {
            return FileTypeEnum.PICTURE.getType();
        } else if (contentType.startsWith("video/")) {
            return FileTypeEnum.VIDEO.getType();
        }
        return FileTypeEnum.UNKNOWN.getType();
    }

    /**
     * 将PO对象转换为DTO对象
     */
    private AttachDTO convertToDTO(AttachPO po) {
        if (po == null) {
            return null;
        }
        AttachDTO dto = new AttachDTO();
        dto.setId(po.getId());
        dto.setFileUuid(po.getFileUuid());
        dto.setClientFileName(po.getClientFileName());
        dto.setDownloadTimes(po.getDownloadTimes());
        // 注意：DTO中的contentLength是Integer类型，而PO中是Long类型
        dto.setContentLength(po.getContentLength() != null ? po.getContentLength().intValue() : null);
        // 这里需要将contentType的编码转回字符串
        dto.setContentType(mapContentTypeToString(po.getContentType()));
        dto.setIsCover(po.getIsCover());
        dto.setWidth(po.getWidth());
        dto.setHeight(po.getHeight());
        dto.setBusinessType(po.getBusinessType());
        dto.setBusinessId(po.getBusinessId());
        dto.setStatus(po.getStatus());
        dto.setCreateUserId(po.getCreateUserId());
        dto.setGmtCreate(po.getGmtCreate());
        dto.setModifiedUserId(po.getModifiedUserId());
        dto.setGmtModified(po.getGmtModified());
        dto.setRemark(po.getRemark());
        dto.setCreateUserName(po.getCreateUserName());
        dto.setModifiedUserName(po.getModifiedUserName());
        return dto;
    }

    /**
     * 将 Integer 类型的枚举值转换为文件类型字符串
     * @param contentType Integer 类型的枚举值，例如 1（图片）或 2（视频）
     * @return 对应的文件类型字符串，例如 "图片" 或 "视频"，都不是则返回 "未知"
     */
    private String mapContentTypeToString(Integer contentType) {
        switch (contentType) {
            case 1:
                return FileTypeEnum.PICTURE.getMessage();
            case 2:
                return FileTypeEnum.VIDEO.getMessage();
            default:
                return FileTypeEnum.UNKNOWN.getMessage();
        }
    }
}
